package fiuba.td.fabrica.model.entities;

import org.junit.Test;

import fiuba.td.fabrica.model.entities.Maquina;
import fiuba.td.fabrica.model.exceptions.TipoMaquinaInvalidoException;
import fiuba.td.fabrica.model.factories.MaquinaFactory;

/**
 * Testing sobre la clase MaquinaProductora
 */
public class MaquinaProductoraTest extends MaquinaTestAbstract{

	/**
	 *  La calidad del producto al salir de la maquina no debe ser alterada
	 */
	@Test
	public void testOperarProductoNoAlterado() {
		this.getMaquina().setEfectividad(100);
		this.operar();
		assertTrue(this.getProducto().getCalidad() == 100);
	}
	
	/**
	 *  La calidad del producto al salir de la maquina puede ser alterada
	 */
	@Test
	public void testOperarProductoAlterado() {
		this.getMaquina().setEfectividad(50);
		this.operar();
		assertTrue(this.getProducto().getCalidad() >= 0 && this.getProducto().getCalidad() <= 100);
	}
	
	/**
	 *  La maquina esta averiada y no puede operar. Debe lanzar una excepcion
	 */
	@Test
	public void testOperarMaquinaAveriada() {
		this.getMaquina().setEfectividad(0);
		this.operar();
		assertTrue(this.getMaquina().isAveriada());
	}

	/**
	 * La calidad del producto al salir de la maquina no va a ser alterada -> 10%
	 */
	@Test
	public void testOperarProductoConBajaCalidadNoAlterado() {
		this.getProducto().setCalidad(10);
		this.operar();
		assertTrue(this.getProducto().getCalidad() == 10);
	}
	
	/**
	 * La calidad del producto al salir de la maquina puede ser alterada
	 * y es muy probable que el producto sea muy defectuoso y su calidad
	 * no debe ser mayot a 50
	 */
	@Test
	public void testOperarProductoConBajaCalidadAlterado() {
		this.getMaquina().setEfectividad(60);
		this.getProducto().setCalidad(50);
		this.operar();
		assertTrue(getProducto().getCalidad() >= 0 && getProducto().getCalidad() <= 50);
	}
	
	
	public Maquina getMaquinaTest() {
		try {
			return MaquinaFactory.getInstance().createMaquinaReal("PRODUCTORA", "Horno", 100, 1, 1);
		} catch (TipoMaquinaInvalidoException e) {
			e.printStackTrace();
			return null;
		}
	}
}